Le kernel C n'est pas installé par défaut avec Jupyter.
Il faut installer jupyter-c-kernel
#include <stdio.h>
int main(int argc, char* argv) {
printf("\nHello world from C from Jupyter notebook!");
}
Hello world from C from Jupyter notebook!
Pour calculer la fonction $n! := 1 \times 2 \times \dots \times n$ ($n\in\mathbb{N}$), on peut penser à une solution récursive (qui coutera en espace mémoire à cause de la pile d'appel) et une solution impérative.
#include <stdio.h>
#define MAX_I 15
int factorielle_rec(int n) {
if (n <= 1) {
return 1;
}
else {
return n * factorielle_rec(n - 1);
}
}
int factorielle_imp(int n) {
int f = 1;
for (int i = 1; i <= n; i++) {
f = f * i; /* f *= i aussi possible*/
}
return f;
}
int main(int argc, char* argv) {
for (int i = 1; i <= MAX_I+2; i++) {
printf("\n factorielle_rec(%d) = %d et factorielle_imp(%d) = %d", i, factorielle_rec(i), i, factorielle_imp(i));
if (i == MAX_I) {
printf("\nValeurs fausses après %i", MAX_I);
}
}
}
factorielle_rec(1) = 1 factorielle_rec(2) = 2 factorielle_rec(3) = 6 factorielle_rec(4) = 24 factorielle_rec(5) = 120 factorielle_rec(6) = 720 factorielle_rec(7) = 5040 factorielle_rec(8) = 40320 factorielle_rec(9) = 362880 factorielle_rec(10) = 3628800 factorielle_rec(11) = 39916800 factorielle_rec(12) = 479001600 factorielle_rec(13) = 1932053504 factorielle_rec(14) = 1278945280 factorielle_rec(15) = 2004310016 Valeurs fausses après 15 factorielle_rec(16) = 2004189184 factorielle_rec(17) = -288522240
Comme on le voit, les valeurs deviennent fausses dès que $i\geq16$.
On peut augmenter la précision en utilisant des long
au lieu d'int
, qui utilisent (sur ma machine) 64 bits au lieu de 32 bits.
Par contre, passer à des long long
n'apporterait rien (sur ma machine).
#include <stdio.h>
#define MAX_I 20
long factorielle_rec(long n) {
if (n <= 1) {
return 1;
}
else {
return n * factorielle_rec(n - 1L);
}
}
long factorielle_imp(long n) {
long f = 1;
for (int i = 1; i <= n; i++) {
f = f * i; /* f *= i aussi possible*/
}
return f;
}
int main(int argc, char* argv) {
for (long i = 1; i <= MAX_I+2; i++) {
printf("\n factorielle_rec(%li) = %li et factorielle_imp(%li) = %li", i, factorielle_rec(i), i, factorielle_imp(i));
if (i == MAX_I) {
printf("\nValeurs fausses après %d", MAX_I);
}
}
}
factorielle_rec(1) = 1 et factorielle_imp(1) = 1 factorielle_rec(2) = 2 et factorielle_imp(2) = 2 factorielle_rec(3) = 6 et factorielle_imp(3) = 6 factorielle_rec(4) = 24 et factorielle_imp(4) = 24 factorielle_rec(5) = 120 et factorielle_imp(5) = 120 factorielle_rec(6) = 720 et factorielle_imp(6) = 720 factorielle_rec(7) = 5040 et factorielle_imp(7) = 5040 factorielle_rec(8) = 40320 et factorielle_imp(8) = 40320 factorielle_rec(9) = 362880 et factorielle_imp(9) = 362880 factorielle_rec(10) = 3628800 et factorielle_imp(10) = 3628800 factorielle_rec(11) = 39916800 et factorielle_imp(11) = 39916800 factorielle_rec(12) = 479001600 et factorielle_imp(12) = 479001600 factorielle_rec(13) = 6227020800 et factorielle_imp(13) = 6227020800 factorielle_rec(14) = 87178291200 et factorielle_imp(14) = 87178291200 factorielle_rec(15) = 1307674368000 et factorielle_imp(15) = 1307674368000 factorielle_rec(16) = 20922789888000 et factorielle_imp(16) = 20922789888000 factorielle_rec(17) = 355687428096000 et factorielle_imp(17) = 355687428096000 factorielle_rec(18) = 6402373705728000 et factorielle_imp(18) = 6402373705728000 factorielle_rec(19) = 121645100408832000 et factorielle_imp(19) = 121645100408832000 factorielle_rec(20) = 2432902008176640000 et factorielle_imp(20) = 2432902008176640000 Valeurs fausses après 20 factorielle_rec(21) = -4249290049419214848 et factorielle_imp(21) = -4249290049419214848 factorielle_rec(22) = -1250660718674968576 et factorielle_imp(22) = -1250660718674968576
TODO: plus tard !